#include <Python.h>
#include <atomic>

class pyobjautoptr {
public:
    explicit pyobjautoptr(PyObject* obj);

    ~pyobjautoptr();

    pyobjautoptr(const pyobjautoptr& other) noexcept;

    pyobjautoptr& operator=(const pyobjautoptr& other) noexcept;

    pyobjautoptr(pyobjautoptr&& other) noexcept;

    pyobjautoptr& operator=(pyobjautoptr&& other) noexcept;

    operator PyObject* ()const noexcept;

    PyObject* get() const noexcept;
    pyobjautoptr& operator=(const PyObject*& other)noexcept;
    pyobjautoptr& operator=(PyObject*& other)noexcept;


private:
    PyObject* res = nullptr;
};
